<?php

namespace app\admin\controller;

use app\admin\common\controller\Common;
use app\common\model\Admin as AdminModel;
use think\Request;
use think\Validate;
use ryan\Rsa;

// 管理员
class Admin extends Common
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        // 开始日
        $start = addslashes(input('get.start'));
        // 截止日
        $cut_off = addslashes(input('get.cut_off'));
        // 名称
        $name = addslashes(input('get.name'));
        // 条件1
        $where1 = '';
        // 条件2
        $where2 = '';
        // 条件3
        $where3 = '';

        // 判断开始日是否不为空
        if (!empty($start)) $where1 .= "FROM_UNIXTIME(`create_time`) >= '$start'";
        // 判断截止日是否不为空
        if (!empty($cut_off)) $where2 .= "FROM_UNIXTIME(`create_time`) <= '$cut_off'";
        // 判断名称是否不为空
        if (!empty($name)) $where3 .= "`name` Like '%$name%'";

        // 获取全部数据
        $datas = AdminModel::field('id, name, role, status, create_time')->where($where1)->where($where2)->where($where3)->order('id', 'desc')->paginate(10, false, ['query' => request()->param()]);

        // 获取分页显示
        $page = $datas->render();

        // 模板变量赋值
        $this->assign(['datas' => $datas, 'page' => $page]);

        // 视图渲染
        return view();
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        // 保存Post数据
        $post = $request->post();

        // 实例化RSA
        $rsa = new Rsa();

        // 解密密码
        $post['password'] = $rsa->decryption($post['password']);

        // 验证
        $validate = $this->validate($post, 'app\admin\validate\Admin');

        // 判断是否验证成功
        if ($validate === true) {   // 成功
            // 查找数据
            $data = AdminModel::where('name', $post['name'])->find();

            // 是否存在数据
            if (!$data) {   // 不存在
                // 加密密码
                $post['password'] = $rsa->encryption($post['password']);

                // 新增数据
                $result = AdminModel::create($post, true);

                // 返回Json数据
                return $result ? json(['message' => '添加成功', 'type' => 'success', 'state' => 200]) : json(['message' => '添加失败', 'type' => 'success', 'state' => 400]);
            } else {    // 存在
                // 返回Json数据
                return json(['message' => '用户名已存在', 'type' => 'warning', 'state' => 400]);
            }
        } else {    // 失败
            // 抛出错误信息
            throw new \Exception($validate);
        }
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        // 获取单个数据
        $data = AdminModel::get(array($id));

        // 返回Json数据
        return $data ? json(['data' => $data, 'message' => '获取数据成功', 'type' => 'success', 'state' => 200]) : json(['data' => $data, 'message' => '获取数据失败', 'type' => 'error', 'state' => 400]);
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        // 保存Put数据
        $put = $request->put();

        // 创建验证
        $validate = Validate::make([
            'name'  =>  'require|min:5|max:18',
            'role' => 'require|number|min:1|max:1'
        ]);

        // 判断是否验证成功
        if ($validate->check($put)) {   // 成功
            // 查找数据
            $data = AdminModel::where('name', $put['name'])->find();

            // 是否不存在此数据或更新当前数据
            if (!$data || $data['id'] == $id) { // 更新当前数据

                // 设置更新条件
                $put['id'] = $id;
                
                // 更新数据
                $result = AdminModel::update($put, true);

                // 返回Json数据
                return $result ? json(['message' => '更新成功', 'type' => 'success', 'state' => 200]) : json(['message' => '更新失败', 'type' => 'error', 'state' => 400]);
            } else {    // 存在
                // 返回Json数据
                return json(['message' => '登录名已存在', 'type' => 'warning', 'state' => 400]);
            }
        } else {    // 失败
            // 抛出错误信息
            throw new \Exception($validate);
        }
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        // 判断是否系统管理员
        if ($id != 1) { // 非系统管理员
            // 删除数据
            $result = AdminModel::destroy(array($id));

            // 返回Json数据
            return $result ? json(['message' => '删除成功', 'type' => 'success', 'state' => 200]) : json(['message' => '删除失败', 'type' => 'error', 'state' => 400]);
        } else { // 系统管理员
            // 返回Json数据
            return json(['message' => '不能操作系统管理员', 'type' => 'error', 'state' => 401]);
        }
    }

    /**
     * 保存更新的状态
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update_status(Request $request, $id)
    {
        // 判断是否系统管理员
        if ($id != 1) {    // 非系统管理员
            // 保存Put数据
            $put = $request->only('status', 'put');

            // 设置更新条件
            $put['id'] = $id;

            // 更新数据
            $result = AdminModel::update($put, true);

            // 返回Json数据
            return $result ? json(['message' => '更新状态成功', 'type' => 'success', 'state' => 200]) : json(['message' => '更新状态失败', 'type' => 'error', 'state' => 400]);
        } else {    // 系统管理员
            // 返回Json数据
            return json(['message' => '不能操作系统管理员', 'type' => 'error', 'state' => 401]);
        }
    }

    /**
     * 保存更新的密码
     *
     * @param  \think\Request  $request
     * @param  int  $id
     */
    public function modify_password(Request $request, $id)
    {
        // 保存Put数据
        $put = $request->only(['old_password', 'new_password'], 'put');

        // 获取单个数据
        $data = AdminModel::get(array($id));

        // 实例化RSA
        $rsa = new Rsa();

        // 解密密码
        $password = $rsa->decryption($data['password']);
        $old_password = $rsa->decryption($put['old_password']);
        $new_password = $rsa->decryption($put['new_password']);

        // 创建验证
        $validate = Validate::make([
            'password' =>  'require|min:5|max:18',
        ]);

        // 创建验证数据
        $data = ['password' => $new_password];

        // 判断是否验证成功
        if ($validate->check($data)) {   // 成功
            // 判断密码是否匹配
            if ($old_password === $password) {  // 匹配
                // 更新密码
                $result = AdminModel::update(['id' => $id, 'password' => $put['new_password']], true);

                // 返回Json数据
                return $result ? json(['message' => '修改成功', 'type' => 'success', 'state' => 200]) : json(['message' => '修改失败', 'type' => 'error', 'state' => 400]);
            } else {    // 不匹配
                // 返回Json数据
                return json(json(['message' => '旧密码不匹配', 'type' => 'warning', 'state' => 401]));
            }
        } else {    // 失败
            // 抛出错误信息
            throw new \Exception($validate->getError());
        }
    }
}
